import pandas as pd
import plotly.express as px
import ipywidgets as widgets
from IPython.display import display
# -------------------------------------------------
# Daten laden & bereinigen (wie in deinen anderen Blöcken)
# -------------------------------------------------
CSV_PATH = "World-Heritage-2025.csv"
df = pd.read_csv(CSV_PATH)
df["date_inscribed"] = pd.to_numeric(df["date_inscribed"],
errors="coerce").astype("Int64")
df = df.dropna(subset=["name_en","date_inscribed","category",
"latitude","longitude"]).reset_index(drop=True)
# -------------------------------------------------
# Widgets definieren
# -------------------------------------------------
cat_options = sorted(df["category"].unique())
cat_widget = widgets.SelectMultiple(
options=cat_options,
value=cat_options, # voreingestellt: alles ausgewählt
description='Kategorie:',
rows=6,
layout=widgets.Layout(width='250px')
)
year_range = (int(df["date_inscribed"].min()),
int(df["date_inscribed"].max()))
year_slider = widgets.IntRangeSlider(
value=year_range,
min=year_range[0],
max=year_range[1],
step=1,
description='Jahre:',
continuous_update=False,
layout=widgets.Layout(width='400px')
)
# -------------------------------------------------
# Update‑Funktion: erzeugt das Plotly‑Figure
# -------------------------------------------------
def update_plot(change=None):
# Filter anwenden
filtered = df[
(df["category"].isin(cat_widget.value)) &
(df["date_inscribed"] >= year_slider.value[0]) &
(df["date_inscribed"] <= year_slider.value[1])
]
# Scatter‑Karte (kann natürlich jede andere Figure sein)
fig = px.scatter_geo(
filtered,
lat="latitude",
lon="longitude",
hover_name="name_en",
color="category",
projection="natural earth",
title="UNESCO‑Welterbestätten (gefiltert)"
)
fig.update_layout(width=850, height=460, margin=dict(l=0, r=0, t=40, b=0))
fig.show()
# -------------------------------------------------
# Beobachter registrieren (wird bei jeder Änderung getriggert)
# -------------------------------------------------
cat_widget.observe(update_plot, names='value')
year_slider.observe(update_plot, names='value')
# -------------------------------------------------
# Layout: Sidebar + Plot
# -------------------------------------------------
sidebar = widgets.VBox([cat_widget, year_slider])
display(sidebar)
# Initiales Plot
update_plot()